{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Import the basic libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython import display\n",
    "import os\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Initialize the environment for running the experiment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Paths for loading/storing results.\n",
    "name = 'results/MixedGaussian_MINEE_MINE' # filename\n",
    "chkpt_name = name+'.pt'              # checkpoint\n",
    "fig_name = name+'.pdf'               # output figure\n",
    "\n",
    "# use GPU if available\n",
    "if torch.cuda.is_available(): \n",
    "    torch.set_default_tensor_type(torch.cuda.FloatTensor)\n",
    "else:\n",
    "    torch.set_default_tensor_type(torch.FloatTensor)\n",
    "\n",
    "# initialize random seed\n",
    "np.random.seed(0)\n",
    "torch.manual_seed(0);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Generate data using the mixed gaussian model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from data.mix_gaussian import MixedGaussian"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_size = 400   # sample size\n",
    "rho = 0.9           # model parameter\n",
    "\n",
    "rep = 1             # number of repeated runs\n",
    "d = 1               # number of dimensions for X (and Y)\n",
    "\n",
    "X = np.zeros((rep,sample_size,d))\n",
    "Y = np.zeros((rep,sample_size,d))\n",
    "mg = MixedGaussian(sample_size=sample_size,rho1=rho,rho2=-rho)\n",
    "for i in range(rep):\n",
    "    for j in range(d):\n",
    "        data = mg.data\n",
    "        X[i,:,j] = data[:,0]\n",
    "        Y[i,:,j] = data[:,1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A plot of the first dimension of $Y$ against that of $X$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[0,:,0],Y[0,:,0],label=\"data\",marker=\"+\",color=\"steelblue\")\n",
    "plt.xlabel('X')\n",
    "plt.ylabel('Y')\n",
    "plt.title('Plot of data samples')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Initialize the MINEE model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from model.minee_mine import MINEE_MINE "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 100       # batch size of data sample\n",
    "ref_batch_factor = 10  # batch size expansion factor for reference sample\n",
    "lr = 1e-4              # learning rate\n",
    "\n",
    "minee_mine_list = []\n",
    "for i in range(rep):\n",
    "    minee_mine_list.append(MINEE_MINE(torch.Tensor(X[i]),torch.Tensor(Y[i]),\n",
    "                            batch_size=batch_size,ref_batch_factor=ref_batch_factor,lr=lr))\n",
    "dXY_list = np.zeros((rep,0))\n",
    "dX_list = np.zeros((rep,0))\n",
    "dY_list = np.zeros((rep,0))\n",
    "mine_dXY_list = np.zeros((rep,0))\n",
    "mi_list = np.zeros((rep,0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load previous results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "load_available = True # set to False to prevent loading previous results\n",
    "if load_available and os.path.exists(chkpt_name):\n",
    "    checkpoint = torch.load(\n",
    "        chkpt_name, map_location='cuda' if torch.cuda.is_available() else 'cpu')\n",
    "    dXY_list = checkpoint['dXY_list']\n",
    "    dX_list = checkpoint['dX_list']\n",
    "    dY_list = checkpoint['dY_list']\n",
    "    mine_dXY_list = checkpoint['mine_dXY_list']\n",
    "    mi_list = checkpoint['mi_list']\n",
    "    minee_mine_state_list = checkpoint['minee_mine_state_list']\n",
    "    for i in range(rep):\n",
    "        minee_mine_list[i].load_state_dict(minee_mine_state_list[i])\n",
    "    print('Previous results loaded.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Continuously train the model with MINEE. The following can be executed repeatedly and after loading previous results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "continue_train = True  # set to True to continue to train\n",
    "num_big_steps = 50     # number of small steps\n",
    "num_small_steps = 200  # number of big steps\n",
    "if continue_train:\n",
    "    for k in range(num_big_steps):\n",
    "        for j in range(num_small_steps):\n",
    "            dXY_list = np.append(dXY_list, np.zeros((rep, 1)), axis=1)\n",
    "            dX_list = np.append(dX_list, np.zeros((rep, 1)), axis=1)\n",
    "            dY_list = np.append(dY_list, np.zeros((rep, 1)), axis=1)\n",
    "            mi_list = np.append(mi_list, np.zeros((rep, 1)), axis=1)\n",
    "            for i in range(rep):\n",
    "                minee_mine_list[i].step_minee()\n",
    "                dXY_list[i, -1], dX_list[i, -1], dY_list[i, -1] = minee_mine_list[i].forward_minee()\n",
    "                mi_list[i, -1] = (dXY_list[i, -1]-dX_list[i, -1]-dY_list[i, -1]).copy()\n",
    "        # To show intermediate works\n",
    "        for i in range(rep):\n",
    "            plt.plot(dXY_list[i, :],label='dXY')\n",
    "            plt.plot(dX_list[i, :],label='dX')\n",
    "            plt.plot(dY_list[i, :],label='dY')\n",
    "            plt.title('Plots of divergence estimates')\n",
    "        display.clear_output(wait=True)\n",
    "        display.display(plt.gcf())\n",
    "    display.clear_output()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Continuously train the model with MINE. The following can be executed repeatedly and after loading previous results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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FVl28flMOuNqdhxbMfyKSimVotI2oR/fruDhwnmD339Ut1miwlFKqbhL24R+uETxwvOk8DyllEoXaZXQR44tGE4m2+HxUjslvs/WVEqpREqrhD6xxbX50yuqJOYBGkoplShpldCVUupopgldKaXSRNom9GR4cLJSShWltE3oSil1tNGErpRSaUITulJKpQlN6EoplSY0oSulVJrQhK6UUmki5RP6VVc25eGH7kp0GEoplXApPx56tStuYmrNtpQc2x98uv4rpdTRJuXP0H+uag0SP0GTuVLqKJfSCX30iN4sL35CosNQSqmkkNIJfUud6okOQSmlkkZKJ3SllFIFNKErpVSaSOmELphEh6CUUkkjpRO65nOllCqQkgl91KN9qf7ZIlZU1cfMKaVUnpRM6JtqVAHgx9KnJDgSpZRKHq4Suoh0FJFlIrJcRPqFKHeViBgRae5diKFonYtSSuUJm9BFJBOYBFwMNAGuE5EmDuXKAfcB870OMpjDUrKodqWUUknPzRl6S2C5MWaFMeYw8BpwuUO5EcBY4KCH8SmllHLJTUKvBazxeb3WnpdPRJoBdYwx74bakIh0F5GFIrJwy5YtEQdbsKHoV1VKqXTlJqE7pc/8ymsRyQD+AzwQbkPGmGeNMc2NMc2ragsVpZTylJuEvhao4/O6NrDe53U54BRgnoisAs4CZsfrxuiYYb2YWbt9PDatlFIpzU1CXwA0FJH6IpIFdAFm5y00xuwyxlQxxtQzxtQDvgM6GWMWxiPgb5o3jcdmlVIq5YVN6MaYHKAn8CHwOzDTGLNYRIaLSKd4B6iUUsodV08sMsbMAeYEzBscpOwFsYellFIqUinYU1Q7EymllJOUS+jaYlEppZylXEJXSinlTBO6UkqliZRL6GK0Dl0ppZykXEJXSinlLOUSut4UVUopZymX0LXZolJKOUu5hC6az5VSylHKJfS9xfWhFkop5STlEvq+zFKJDkEppZJSyiV0pZRSzlIuof9VrEGiQ1BKqaSUcgldKaWUM03oSimVJjShK6VUmtCErpRSaUITulJKpQlN6EoplSY0oSulVJrQhK6UUmlCE7pSSqUJTehKKZUmNKErpVSa0ISulFJpQhO6UkqlCU3oSimVJjShK6VUmtCErpRSaUITulJKpQlN6EoplSY0oSulVJrQhK6UUmnCVUIXkY4iskxElotI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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "continue_train = True  # set to True to continue to train\n",
    "num_big_steps = 350     # number of small steps\n",
    "num_small_steps = 200  # number of big steps\n",
    "if continue_train:\n",
    "    for k in range(num_big_steps):\n",
    "        for j in range(num_small_steps):\n",
    "            mine_dXY_list = np.append(mine_dXY_list, np.zeros((rep, 1)), axis=1)\n",
    "            mi_list = np.append(mi_list, np.zeros((rep, 1)), axis=1)\n",
    "            for i in range(rep):\n",
    "                minee_mine_list[i].step_mine()\n",
    "                mine_dXY_list[i,-1] = minee_mine_list[i].forward_mine()\n",
    "                mi_list[i,-1] = mine_dXY_list[i, -1].copy()\n",
    "        # To show intermediate works\n",
    "        for i in range(rep):\n",
    "            plt.plot(mine_dXY_list[i, :],label='dXY')\n",
    "            plt.title('Plots of divergence estimates')\n",
    "        display.clear_output(wait=True)\n",
    "        display.display(plt.gcf())\n",
    "    display.clear_output()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### Save current results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Current results saved.\n"
     ]
    }
   ],
   "source": [
    "overwrite = False  # set to True to overwrite previously stored results\n",
    "if overwrite or not os.path.exists(chkpt_name):\n",
    "    minee_mine_state_list = [minee_mine_list[i].state_dict() for i in range(rep)]\n",
    "    torch.save({\n",
    "        'dXY_list': dXY_list,\n",
    "        'dX_list': dX_list,\n",
    "        'dY_list': dY_list,\n",
    "        'mine_dXY_list': mine_dXY_list,\n",
    "        'mi_list': mi_list,\n",
    "        'minee_mine_state_list': minee_mine_state_list\n",
    "    }, chkpt_name)\n",
    "    print('Current results saved.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Analysis"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Calculate the ground truth mutual information."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ground truth is 0.4084425498386879 nats.\n"
     ]
    }
   ],
   "source": [
    "mi = mg.ground_truth * d\n",
    "print('Ground truth is {} nats.'.format(mi))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Apply moving average to smooth out the mutual information estimate."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "mi_ma_rate = 0.01            # rate of moving average\n",
    "smooth_mi_list = mi_list\n",
    "for i in range(1,smooth_mi_list.shape[1]):\n",
    "    smooth_mi_list[:,i] = (1-mi_ma_rate) * smooth_mi_list[:,i-1] + mi_ma_rate * smooth_mi_list[:,i]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot the mutual information estimate after different number of iterations. The red dashed line shows the ground truth, and the green dotted line is the number of iterations where 90% of the ground truth is reached."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.axhline(mi,label='ground truth',linestyle='--',color='red')\n",
    "for i in range(rep):\n",
    "    plt.plot(smooth_mi_list[i,:],color='steelblue')\n",
    "    plt.axvline(10000,label='switch from MINEE to MINE',linestyle='-.',color='gray')\n",
    "    for t in range(smooth_mi_list[i].shape[0]):\n",
    "        if (smooth_mi_list[0,t]>.9*mi):\n",
    "            plt.axvline(t,label='90% reached',linestyle=':',color='green')\n",
    "            break\n",
    "#plt.title(\"Plot of MI estimates against number of iteractions\")\n",
    "plt.xlim((0,smooth_mi_list[0].shape[0]))\n",
    "plt.ylim((0,mi*1.1))\n",
    "plt.xlabel(\"number of iterations\")\n",
    "plt.ylabel(\"MI estimate\")\n",
    "plt.legend()\n",
    "plt.savefig(fig_name)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
